﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//智能指针
template<class T>
class SmartPtr {
public:
	SmartPtr(T* ptr = nullptr)
		: _ptr(ptr)
	{ }
	~SmartPtr()
	{
		if (_ptr)
			delete _ptr;
	}
	T& operator*() { return *_ptr; }
	T* operator->() { return _ptr; }
private:
	T* _ptr;
};

struct Date
{
	int _year;
	int _month;
	int _day;

	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}

	~Date()
	{
		cout << "~Date()" << endl;
	}
};

//int main()
//{
//	/*SmartPtr<Date> sp1(new Date);
//	SmartPtr<Date> sp2(sp1);不能拷贝*/
//
//
//	//auto_ptr<Date> ap1(new Date);
//	//// 拷⻉时把被拷⻉对象的资源的管理权转移给拷⻉对象，
//	//auto_ptr<Date> ap2(ap1);
//	//ap1->_year++;会报错
//
//	return 0;
//}


//int main()
//{
//	// C++11
//// 不支持拷贝
//	unique_ptr<Date> up1(new Date);
//	//unique_ptr<Date> up2(up1);
	
// 支持拷贝
//	shared_ptr<Date> sp1(new Date);
//	shared_ptr<Date> sp2(sp1);
//	shared_ptr<Date> sp3(sp2);
//	cout << sp1.use_count() << endl;
//
//	return 0;
//}


template<class T>
class DeleteArray
{
public:
	void operator()(T* ptr)
	{
		delete[] ptr;
	}
};

class Fclose
{
public:
	void operator()(FILE* ptr)
	{
		cout << "fclose:" << ptr << endl;
		fclose(ptr);
	}
};

//int main()
//{

//	//// 定制删除器
//	////unique_ptr<Date, DeleteArray<Date>> up2(new Date[5]);
//	//unique_ptr<Date[]> up2(new Date[5]);//删除多个也可以这样
//	//unique_ptr<FILE, Fclose> up3(fopen("test.cpp", "r"));定制删除器在这里加unique_ptr<FILE, Fclose> 
//

//share可以这样删除
//	shared_ptr<Date[]> sp4(new Date[5]);
//	shared_ptr<FILE> sp5(fopen("test.cpp", "r"), Fclose());//定制删除器在构造函数里面加
//
// //	shared_ptr<Date> sp6 = make_shared<Date>(2024, 8, 5);make_shared可以把Date给创建出来交给share智能指针

//	return 0;
//}

////////////////////////////////////////////////////////////////////////////////////////////////
//模拟实现share_ptr
#include"shared_ptr.h"
//循环引用(指针互相指向)导致内存泄漏
int main()
{

	return 0;
}